package unipi.servlets;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import unipi.database.ErrorCodes;
import unipi.database.User;
import unipi.helpers.Hash;
import unipi.helpers.LoginCookie;
import unipi.helpers.Validator;

public class EditProfile  extends HttpServlet
{
	private static final long serialVersionUID = 1L;
	
	public EditProfile()
	{
		super();
	}
	
	public void init() throws ServletException
	{
		
	
	}
	
	private boolean nullEquals(String str1, String str2)
	{
		if(str1 == null && str2 == null)
			return true;
		
		if(str1 == null)
			return str2.equals(str1);
		
		if(str2 == null)
			return str1.equals(str2);
		
		return str1.equals(str2);
		
	}
		
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		if(!LoginCookie.authCookie(request))
			response.sendRedirect("Login");
		else
		{
			String uid = LoginCookie.Get(request)[0];
			
			request.setCharacterEncoding("UTF-8");
			String name = request.getParameter("name");
			String surname = request.getParameter("surname");
			String dptID = request.getParameter("department");
			String pos = request.getParameter("position");
			String hours = request.getParameter("hours");
			String username = request.getParameter("username");
			String oldpass = request.getParameter("oldpass");
			String newpass = request.getParameter("newpass");
			
			if(name != null && surname != null && dptID != null && pos != null && hours != null &&
					username != null && oldpass != null && newpass!= null)
			{				
				String message = "";
				boolean needsApproval = false;
				
				name = Validator.escape(name);
				surname = Validator.escape(surname);
				dptID = Validator.escape(dptID);
				pos = Validator.escape(pos);
				username = Validator.escape(username);
				
				if(!Validator.isNumber(hours))
				{
					message += "Το πεδίο Ώρες/Εβδομάδα πρέπει να είναι αριθμός.<br />";
				}
				else
				{					
					Map<String, String> userData = User.getUserData(uid);
					
					if(userData == null)
					{
						message += "Παρουσιάστηκε σφάλμα κατα την φόρτωση των στοιχείων σας.<br />";
					}
					else
					{
						List<String> columns = new ArrayList<String>();
						List<String> values = new ArrayList<String>();
						
						columns.add("name"); values.add("'" + name + "'");
						columns.add("surname"); values.add("'" + surname + "'");
						columns.add("dptID"); values.add(dptID);
						columns.add("position"); values.add(pos.equals("") ? "null" : "'" + pos + "'");
						columns.add("hoursPerWeek"); values.add(hours.equals("") ? "null" : "'" + hours + "'");
						columns.add("username"); values.add("'" + username + "'");
						
						
						if (!name.equals(userData.get("name")) ||
							!surname.equals(userData.get("surname")) ||  
							!dptID.equals(userData.get("dptID")) ||
							!nullEquals(userData.get("hours"),hours.equals("")?null:hours))							   
						{	
							columns.add("approved");
							values.add("false");
							needsApproval = true;
						}
							
						if(!newpass.equals(""))
						{
							if(userData.get("password").equals(Hash.SHA1(oldpass)))
							{
								columns.add("password");
								values.add("'" + Hash.SHA1(newpass) + "'");
							}
							else
							{
								message += "Ο κωδικός σας δεν άλλαξε, γιατί ο κωδικός που εισάγατε είναι λανθασμένος.<br />";
							}
						}				
										
						ErrorCodes userEdit = User.Edit(uid, columns.toArray(new String[columns.size()]),
															 values.toArray(new String[values.size()]));
						if (userEdit != ErrorCodes.OK)
						{
							message += "Πρόβλημα κατα την εισαγωγή των δεδομένων σας. Δοκιμάστε ξανά.<br />";	
							System.out.println("Database error on user edit: " + userEdit);
						}
					}		
				}
				
				if(message.equals("")) message = "Οι αλλαγές κατοχυρώθηκαν με επιτυχία.";						
				
				if(needsApproval)
					response.sendRedirect("Logout");
				else
				{
					String[] msg = new String[]{message, "", "", ""};
					request.setAttribute("message", msg);
					RequestDispatcher rq = request.getRequestDispatcher("Profile");
					rq.forward(request, response);			
				}
				
			}
			else
			{
				String[] msg = new String[]{"Πρόβλημα κατα την εισαγωγή των δεδομένων σας. Δοκιμάστε ξανά.<br />", "", "", ""};
				request.setAttribute("message", msg);
				RequestDispatcher rq = request.getRequestDispatcher("Profile");
				rq.forward(request, response);					
			}
			
			
			
		}

	}

}
